package br.ufrn.sipac.patrimonio.coletor.activity;

import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import br.ufrn.sipac.patrimonio.auxiliares.StatusLevantamento;
import br.ufrn.sipac.patrimonio.coletor.R;
import br.ufrn.sipac.patrimonio.coletor.controller.DatabaseController;
import br.ufrn.sipac.patrimonio.coletor.controller.LevantamentoController;
import br.ufrn.sipac.patrimonio.coletor.controller.MainController;
import br.ufrn.sipac.patrimonio.coletor.dominio.Bem;
import br.ufrn.sipac.patrimonio.coletor.dominio.ItemLevantamento;
import br.ufrn.sipac.patrimonio.coletor.dominio.Persistencia;
import br.ufrn.sipac.patrimonio.coletor.dominio.Unidade;
import br.ufrn.sipac.patrimonio.coletor.dominio.UsuarioColetor;
import br.ufrn.sipac.patrimonio.coletor.exception.DatabaseException;
import br.ufrn.sipac.patrimonio.coletor.exception.NegocioException;
import br.ufrn.sipac.patrimonio.coletor.exception.TransmissaoException;
import br.ufrn.sipac.patrimonio.coletor.transmissao.GenericSOAP;

/**
 * Activity que habilita o envio dos dados do levantamento patrimonial para o
 * SIPAC.
 */
public class AutenticarFinalizarActivity extends Activity {
	private Button enviarLevantamento;
	private EditText login;
	private EditText senha;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_autenticar_finalizar);

		// Mapear os componente da tela
		enviarLevantamento = (Button) findViewById(R.id.button1);
		login = (EditText) findViewById(R.id.editText1);
		senha = (EditText) findViewById(R.id.editText2);

		// Adiciona listeners
		enviarLevantamento.setOnClickListener(new EnviarLevantamentoListener());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.autenticar_finalizar, menu);
		return true;
	}

	/**
	 * Carrega menu da aplicação.
	 */
	private void iniciaMenu() {
		finish();
		Intent intent = new Intent(this, MenuActivity.class);
		startActivity(intent);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.item2:
			iniciaMenu();
		case R.id.item1:
			finish();
		}
		return false;
	}

	/**
	 * Autentica o usuário e envia dados do levantamento para o SIPAC.
	 * 
	 * @throws TransmissaoException
	 */
	public void enviaLevantamento() throws NegocioException,
			TransmissaoException {
		GenericSOAP soapUtil = new GenericSOAP();
		if (login.getText() == null
				|| !login.getText().toString().trim().equals("")
				&& senha.getText() == null
				|| !senha.getText().toString().trim().equals("")) {

			/**
			 * Nesse momento é realizada a autenticação via web-service.
			 */
			Boolean autenticado = soapUtil.autenticar(login.getText()
					.toString(), senha.getText().toString(), this);
			if (autenticado == null || !autenticado.booleanValue()) {
				throw new NegocioException("Login/Senha inválidos.", this);
			}

			else {

				/**
				 * Requisição para saber quais as unidades que o usuário possui
				 * permissão.
				 */
				Collection unidades = soapUtil.findUnidadesPermissao(login
						.getText().toString().trim(), this);

				/**
				 * Outra requisição ao servidor para buscar os dados referentes
				 * ao usuário conectado no coletor para popular o levantamento.
				 */
				UsuarioColetor usu = soapUtil.capturarUsuario(login.getText()
						.toString().trim(), this);

				try {
					/**
					 * Capturando unidade do levantamento.
					 */
					Persistencia obj = DatabaseController.findUnidadeById(this,
							LevantamentoController.getInstance().getLevantamento().getLocal().getUnidade().getId());
					Unidade uni = new Unidade(obj.getId());

					if (usu.getUnidade() != null
							&& usu.getUnidade().getId() > 0) {
						boolean semPermissao = true;
						if (unidades != null && unidades.size() > 0) {
							for (Object object : unidades) {
								Unidade uniDto = (Unidade) object;
								if (uniDto.getId() == uni.getId()) {
									semPermissao = false;
								}
							}
						}
						if (semPermissao) {
							throw new NegocioException(
									"O usuário não possui permissão para efetuar o levantamento nessa unidade.",
									this);
						}
					}
					Vector itensDTO = new Vector();
					Iterator it = LevantamentoController.getInstance().getItens().iterator();
					while (it.hasNext()) {
						ItemLevantamento itemDTO = (ItemLevantamento) it.next();

						// Sincroniza os dados do bem para manter consistência
						// com o SIPAC.
						GenericSOAP soap = new GenericSOAP();
						Bem bemDTO = soap.findByNumCod(
								Integer.parseInt(itemDTO.getNumTombamento()),
								this);
						// O bem está no SIPAC.
						if (bemDTO != null) {
							itemDTO.setBem(bemDTO);
							itemDTO.setMarca(null);
							itemDTO.setEstado(bemDTO.getStatus());
							itemDTO.setDenominacao(bemDTO.getDenominacao());
							// Atualiza o item do levantamento localmente.
							DatabaseController.updateItemLevantamento(itemDTO,
									this);
						}

						// Evitar erro no servidor.
						if (itemDTO.getMarca() == null)
							itemDTO.setMarca("Não informada");

						itensDTO.addElement(itemDTO.toString());
					}

					// Adiciona o usuário que finalizou o levantamento.
					LevantamentoController.getInstance().getLevantamento().setUsuario(usu);
					Boolean sucess = Boolean.parseBoolean(soapUtil
							.gravarLevantamento(
									LevantamentoController.getInstance().getLevantamento(), itensDTO,
									this));

					if (sucess) {
						// Atualiza levantamento para finalizado
						LevantamentoController.getInstance().getLevantamento().setStatus(
								StatusLevantamento.FINALIZADO);
						DatabaseController.updateLevantamento(
								LevantamentoController.getInstance().getLevantamento(), this);

						final AlertDialog.Builder builder = new AlertDialog.Builder(
								this);

						builder.setTitle("Aviso");
						builder.setMessage("Levantamento finalizado com sucesso!");
						builder.setPositiveButton("OK", new OnClickListener() {
							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								iniciaMenu();
							}
						});
						builder.show();
					} else {
						throw new TransmissaoException(this);
					}
					LevantamentoController.getInstance().getLevantamento().setUsuario(usu);
				} catch (DatabaseException e) {
				}

			}
		} else
			throw new NegocioException("Preencher login e senha.", this);
	}

	/**
	 * Listener que lida com a submissão de dados do levantamento patrimonial.
	 */
	public class EnviarLevantamentoListener implements Button.OnClickListener {
		@Override
		public void onClick(View arg0) {
			try {
				enviaLevantamento();
			} catch (NegocioException e) {
			} catch (TransmissaoException e) {
			}
		}
	}

	@Override
	public void onBackPressed() {
		// Desabilita botão voltar.
	}
}
